package 多线程;

/**
 * 1. 在lambda表达式内部，' this'指的是为lambda生成的匿名内部类的实例。
 * 它不引用定义了“lock”对象的“Main”类的实例。因此，使用'this.wait()不会为您提供等待'lock'对象的预期行为。
 * 2. 要在对象上调用' wait()'和' notify()'，您需要获取该特定对象上的锁。在本例中，'lock '对象用于同步，
 * 因此您应该使用'lock.wait()”和“lock.notify ()，以确保正确的锁用于线程之间的协调。
 */
class TwoThreadPrint {
    static Object lock = new Object();
    static boolean isReady = true;
    static int i = 1;
    static int end = 101;

    public void test() throws InterruptedException {
        // 两个线程，一个打印奇数，另一个打印偶数

        Thread thd_1 = new Thread(() -> {
            while (i < end) {
                synchronized (lock) {
                    while (!isReady) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    if  (i < end) System.out.println("线程A [" + i + "]");
                    i ++;
                    isReady = false;
                    lock.notify();
                }
            }
        });


        Thread thd_2 = new Thread(() -> {
            while (i < end) {
                synchronized (lock) {
                    while (isReady) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    if (i < end) System.out.println("线程B [" + i + "]");
                    i ++;
                    isReady = true;
                    lock.notify();
                }
            }
        });

        thd_1.start();
        thd_2.start();

        thd_1.join();
        thd_2.join();
    }
}
